Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.02.2013, 18:09
Интересующийся
Отправить личное сообщение для All_ex74 Посмотреть профиль Найти все сообщения от All_ex74
 
Регистрация: 20.01.2013
Сообщений: 16

Как реализовать autosubmit средствами ajax с небольшой задержкой и выводом alert ?
Здравствуйте уважаемые форумчане.
Помогите до- реализовать несведующему небольшую конструкцию.
Суть в следующем. Имеется форма, открывающаяся в модальном окне:

модальное окно (код ниже):

<div id="myModal6" class="reveal-modal pay-list">
<div  id="pay-list">

<script type="text/javascript">  //пассивная валидация полей формы
$(document).ready(function() {

$('.example2').ketchup({
  validationAttribute: 'rel',
  errorContainer: $('<div>', {
    'class': 'ketchup-error-container-alt',
    html: '<ol></ol>'
  }),
  initialPositionContainer: function(errorContainer, field) {
    //errorContainer = контейнер для сообщений об ошибках со всеми наследниками
    //field = поле, которое нужно проверить
  },
  positionContainer: function(errorContainer, field) {},
  showContainer: function(errorContainer) {
    errorContainer.slideDown('fast');
  },
  hideContainer: function(errorContainer) {
    errorContainer.slideUp('fast');
  }
});
 
});
</script>

<form action="" id="myform" name="myform">
<input type="text" name="pname" id="pname" />
<input type="text" name="pcode" id="pcode" />
<input type="text" name="pinfo" id="pinfo" />
<input type="text" name="price" id="price" />
<input type="button" onclick="send();" value="Отправить" />
</form>

<div id="alert"></div>
<div id="result"></div>

<script type="text/javascript">

function send() {

   var pname = $('#pname').val() //Получаем параметры
   var pcode = $('#pcode').val() //Получаем параметры
   var pinfo = $('#pinfo').val() //Получаем параметры
   var price = $('#price').val() //Получаем параметры

  // Отсылаем паметры
       $.ajax({
                type: 'POST',
                url: 'content/send-pay.php',				
				data: {onpname : pname, onpcode : pcode, onpinfo : pinfo, onprice : price},
				
				// Выводим то что вернул PHP
                success: function(html) {
                        $('#result').empty();  //предварительно очищаем нужный элемент страницы
                        $('#result').append(html); //и выводим ответ php скрипта
                }
        });

}

</script>

	</div>
	<a class="close-reveal-modal">×</a>
</div>


При нажатии "Отправить" введенные в форму данные передаются ajax-скриптом методом POST обработчику платежной формы send-pay.php:

send-pay.php (код ниже)
<?php

class PayU
{
	static $key, $merchant;
	var $url = "https://securesite.ru/order/list.php";


	function __construct( $merch, $key )
	{
		if ( !isset( $merch ) || !isset( $key )  ) die( "Error merchant settings" );
		self::$merchant = $merch;
		self::$key = $key;
	}

#---------------------------------------------------------------------------------------
# Стандартные функции
#---------------------------------------------------------------------------------------

	# Генерируем hmac для запроса.
	function md5_hmac($key = null, $data) 
	{	
		if ( $key == null ) $key = self::$key;
  		$b = 64; 	# Длина байта для md5
 		if (strlen($key) > $b) $key = pack("H*",md5($key));
  
  		$key  = str_pad($key, $b, chr(0x00));
  		$ipad = str_pad('', $b, chr(0x36));
  		$opad = str_pad('', $b, chr(0x5c));
  		$k_ipad = $key ^ $ipad;
  		$k_opad = $key ^ $opad;
  		return md5($k_opad  . pack("H*", md5($k_ipad . $data)));
	}


	function Signature( $data = null ) 
	{		
		if ( $data == null ) $data = $this->data;
		$str = "";
		foreach ( $data as $v ) $str .= $this->convData( $v );
		return $this->md5_hmac( self::$key, $str );
	}

#---------------------------------------------------------------------------------------
# Создаем запрос
#---------------------------------------------------------------------------------------

	function update( $arr )
	{
		$this->data['MERCHANT'] = self::$merchant;
		$this->data = array_merge( $this->data, $arr );
		$this->data['ORDER_HASH'] = $this->Signature();
		return $this;
	}

	function debug( $deb = 0 )
	{
		$this->data['TESTORDER'] = ( $deb == 1 ) ? "TRUE" : "FALSE";
		$this->data['DEBUG'] = $deb;
		return $this;
	}

	# Выводит строку в формате 'hmac'. Строка в формате 'aa' возвращается в '2aa'.
	function convString($string) 
	{
 	 return strlen($string) . $string;
	}

	# Так же, как convString,за исключением того,
	# что здесь он получает массив строк и возвращает строку из всех значений в массиве.
	function convArray($array) 
	{
  		$return = '';
  		foreach ($array as $v) $return .= $this->convString( $v );
  		return $return;
	}


	function convData( $val )
	{
		return ( is_array( $val ) ) ? $this->convArray( $val ) : $this->convString( $val );
	}

	# Делаем поля <input > для формы
	function makeString ( $name, $val )
	{
		$str = "";
		if ( !is_array( $val ) ) return '<input type="hidden" name="'.$name.'" value="'.$val.'">';
		foreach ($val as $v) $str .= $this->makeString( $name.'[]', $v );
		return $str;
	}

	function getForm()
	{	
		$form = '<form method="post" action="'.$this->url.'" id="goform" name="goform">';
		foreach ( $this->data as $k => $v ) $form .= $this->makeString( $k, $v );
		return $form . "<input type='submit' name='submit' value='Автосабмит'></form>";
	}

#---------------------------------------------------------------------------------------
# Читаем ответ
#---------------------------------------------------------------------------------------

	function getPostData()
	{
		$this->post =  $_POST;
		$array = array( "IPN_PID", "IPN_PNAME", "IPN_DATE", "ORDERSTATUS" );
		foreach ( $array as $name ) if (!isset( $this->post[$name] ) ) die( "Incorrect data" );
		$this->datetime = date("YmdHis");
		return $this;
	}

	function checkHashSignature()
	{	
		$post = &$this->post;
		$hash = $post["HASH"];  
		unset( $post["HASH"] );
		$sign = $this->Signature( $post );
		return ( $hash != $sign ) ? false : true ;
		 
	}

	function createAnswer()
	{	
		$datetime = &$this->datetime;
		$post = &$this->post;
		$data = array(
				   "IPN_PID" => $post[ "IPN_PID" ][0], 
				   "IPN_PNAME" => $post[ "IPN_PNAME" ][0], 
				   "IPN_DATE" => $post[ "IPN_DATE" ], 
				   "DATE" => $datetime
					);

		$sign = $this->Signature( $data );
		return "<EPAYMENT>$datetime|$sign</EPAYMENT>";
	}

}

#--------------------------------------------------------------------------------------------
# Образец 
#============================================================================================

$PayU = new PayU( 'xx-xx-xx', 'xxxxxx' );

if ( isset( $_GET['read'] )  )  # Читаем ответ
{

	$check = $PayU->getPostData()->checkHashSignature();

	if ( !$check )  die( "Incorrect signature" );
	$answer = $PayU->createAnswer();

	##
	#  Настраиваем
	#  переменные данные - $post или $_POST
	##

	die( $answer );
} 
	else  # Создаем форму
{

	$orderID = md5( "payuTestOrder_".time() );

    $onpname = $_POST[onpname];
	$onpcode = $_POST[onpcode];
	$onpinfo = $_POST[onpinfo];
	$onprice = $_POST[onprice];
	
	$forSend = array (
					'ORDER_REF' => $orderID,
					'ORDER_DATE' => date("Y-m-d H:i:s"),
					'ORDER_PNAME' => array( $onpname ),
					'ORDER_PCODE' => array( $onpcode ),
					'ORDER_PINFO' => array( $onpinfo ),
					'ORDER_PRICE' => array( $onprice ),
					'ORDER_QTY' => array( 1 ), 
					'ORDER_VAT' => array( 19 ), 
					'ORDER_SHIPPING' => array( 0.1 ),
					'PRICES_CURRENCY' => "RUB"			
				  );
	
	$form = $PayU->update( $forSend )->debug(1)->getForm();

	echo $form;

}
?>


...который в свою очередь обрабатывает полученные данные, собирает другую форму со скрытыми полями и подгружает её в то-же модальное окно, в блок #result(строка 13) - под первой формой выводится еще одна кнопка отправки. Я ее обозвал "Автосабмит"(строка 097) для наглядности.

Никак не получается реализовать авто-отправку второй формы методом того же ajax. Необходимо чтобы кнопка "Автосабмит" не появлялась, а вторая форма отправлялась с небольшой (регулируемой) задержкой. Желательно показать сообщение в случае ошибки отправки, в блоке #alert(строка 12).

Думаю созданная тема пригодится и другим посетителям форума.
Заранее спасибо, не раз находил здесь оригинальные и верные решения...

Последний раз редактировалось All_ex74, 17.02.2013 в 10:12.
Ответить с цитированием
  #2 (permalink)  
Старый 16.02.2013, 18:32
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Кнопку отправить сделать не субмитящей кнопкой , с анализом клика, по клику делаем submit с задержкой
Зы: Код даже не смотрел, - длинный больно
Ответить с цитированием
  #3 (permalink)  
Старый 16.02.2013, 18:44
Интересующийся
Отправить личное сообщение для All_ex74 Посмотреть профиль Найти все сообщения от All_ex74
 
Регистрация: 20.01.2013
Сообщений: 16

Она связана с передачей данных полей в send-pay.php ... К сожалению сам разобраться не могу.
Ответить с цитированием
  #4 (permalink)  
Старый 16.02.2013, 18:46
Интересующийся
Отправить личное сообщение для All_ex74 Посмотреть профиль Найти все сообщения от All_ex74
 
Регистрация: 20.01.2013
Сообщений: 16

Подскажите код кнопки с временной задержкой отправки для моего случая...
Ответить с цитированием
  #5 (permalink)  
Старый 16.02.2013, 19:10
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Ccылка есть на Инет страницу с действующим скриптом ?
Ответить с цитированием
  #6 (permalink)  
Старый 16.02.2013, 19:26
Интересующийся
Отправить личное сообщение для All_ex74 Посмотреть профиль Найти все сообщения от All_ex74
 
Регистрация: 20.01.2013
Сообщений: 16

сайт yagool.ru, кнопка корзина...
Ответить с цитированием
  #7 (permalink)  
Старый 16.02.2013, 19:28
Интересующийся
Отправить личное сообщение для All_ex74 Посмотреть профиль Найти все сообщения от All_ex74
 
Регистрация: 20.01.2013
Сообщений: 16

поля hidden сделал text для наглядности...
Ответить с цитированием
  #8 (permalink)  
Старый 16.02.2013, 20:21
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от All_ex74
сайт yagool.ru, кнопка корзина...
Не понял где "Отправить",
а где "Автосабмит"
Мон ссылку на скриншот со стрелкой ?
Ответить с цитированием
  #9 (permalink)  
Старый 16.02.2013, 21:01
Интересующийся
Отправить личное сообщение для All_ex74 Посмотреть профиль Найти все сообщения от All_ex74
 
Регистрация: 20.01.2013
Сообщений: 16

Формы не сверстаны, стили еще не подключены.
Модальное окно с первой формой:



На следующем изображении, после нажатия на кнопку Отправить, ниже под первой подгружается вторая форма c кнопкой Перейти на страницу оплаты (Автосабмит), сгенерированная обработчиком send-pay.php Вот её то и хочу заставить сабмитится автоматом с некоторой задержкой и алертами в DOM...



Поля второй формы в нормальном состоянии имеют свойство hidden, я их сделал text для наглядности...
Эта конструкция будет каркасом, её в дальнейшем планирую обвешивать дополнительными функциями.

Последний раз редактировалось All_ex74, 16.02.2013 в 21:10.
Ответить с цитированием
  #10 (permalink)  
Старый 16.02.2013, 21:35
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от All_ex74
ниже под первой подгружается вторая форма c кнопкой Перейти на страницу оплаты (Автосабмит), сгенерированная обработчиком send-pay.php Вот её то и хочу заставить сабмитится автоматом с некоторой задержкой и алертами в DOM...
Добавка cиним
Цитата:
// Выводим то что вернул PHP
success: function(html) {
$('#result').empty(); //предварительно очищаем нужный элемент страницы
$('#result').append(html); //и выводим ответ php скрипта
var Form = $('#result').find('form:first');
if(Form.length) setTimeout('Form.submit()',1000);
Кнопку можно изъять из формы

Последний раз редактировалось Deff, 16.02.2013 в 21:51.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как заставить событие при resize сработать с небольшой задержкой один раз? mitiya Общие вопросы Javascript 3 21.10.2012 20:00
Как можно такое реализовать? Jquery & Ajax _M_ jQuery 5 16.07.2012 13:24